/*
* 实现自定义的N次连续点击
* many_click(_click_num, call_func)
* 必填：_click_num 点击次数 [1, 10]
* 必填：call_func 回调函数
* */
let click_before_time = 0;
let click_num = 0;
export const many_click = (_click_num, call_func) => {
  // 安全校验
  if (typeof _click_num !== "number") { console.info("many_click(_click_num, call_func)的点击次数为number类型"); return; }
  if (!call_func) { console.info("many_click(_click_num, call_func)无回调函数"); return; }
  // 处理click_num的新值情况
  if (click_num === 0) {
    click_num = _click_num;
  } else {
    if (click_num < 1 || click_num > 10) { click_num = 1; } /*只准1击至10击，其他情况默认1击*/
  }
  // 处理点击之时差
  let click_time = Date.parse(new Date()) + (new Date()).getMilliseconds(); // 毫秒时间戳
  if ((click_time - click_before_time) < 400) { // 下一次点击是否成功
    click_before_time = Date.parse(new Date()) + (new Date()).getMilliseconds(); click_num--;
  } else { // 第一次点击
    click_before_time = Date.parse(new Date()) + (new Date()).getMilliseconds();
    if (click_num < _click_num) { /*清除历史不成功点击的参数*/
      click_num = _click_num;
    }
  }
  // N次成功点击后启用回调函数，并初始化click_num
  if (click_num === 1) {
    call_func("回调函数不需要传参"); click_num = 0; /*初始化点击次数*/
  }
}

//时间戳转换
export const timestampToTime = (timestamp) => {
  var date = new Date(timestamp * 1000);//时间戳为10位需*1000，时间戳为13位的话不需乘1000
  var Y = date.getFullYear() + '-';
  var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
  var D = date.getDate() + ' ';
  var h = date.getHours() < 10 ? '0' + date.getHours() + ':' : date.getHours() + ':';
  var m = date.getMinutes() < 10 ? '0' + date.getMinutes() + ':' : date.getMinutes() + ':';
  var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
  return Y + M + D + h + m + s;
  //return h+m;
},

/*
trim(str, pos)
该方法可以去除空格，分别可以去除所有空格，两端空格，左边空格，右边空格，默认为去除两端空格

str <String> 字符串
pos <String> 去除那些位置的空格，可选为：both-默认值，去除两端空格，left-去除左边空格，right-去除右边空格，all-去除包括中间和两端的所有空格
*/
export const trim=(str, pos = 'both')=> {
   if (pos == 'both') {
       return str.replace(/^\s+|\s+$/g, "");
   } else if (pos == "left") {
       return str.replace(/^\s*/, '');
   } else if (pos == 'right') {
       return str.replace(/(\s*$)/g, "");
   } else if (pos == 'all') {
       return str.replace(/\s+/g, "");
   } else {
       return str;
   }
}


let timer, flag;
/**
 * 节流原理：在一定时间内，只能触发一次
 * 
 * @param {Function} func 要执行的回调函数 
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行
 * @return null
 */
 export const throttle=(func, wait = 500, immediate = true)=> {
	if (immediate) {
		if (!flag) {
			flag = true;
			// 如果是立即执行，则在wait毫秒内开始时执行
			typeof func === 'function' && func();
			timer = setTimeout(() => {
				flag = false;
			}, wait);
		}
	} else {
		if (!flag) {
			flag = true
			// 如果是非立即执行，则在wait毫秒内的结束处执行
			timer = setTimeout(() => {
				flag = false
				typeof func === 'function' && func();
			}, wait);
		}
		
	}
};

// 打乱数组
export const randomArray=(array = [])=> {
	// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0
	return array.sort(() => Math.random() - 0.5);
}

let timeout = null;

/**
 * 防抖原理：一定时间内，只有最后一次操作，再过wait毫秒后才执行函数
 * 
 * @param {Function} func 要执行的回调函数 
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行 
 * @return null
 */
 export const debounce=(func, wait = 500, immediate = false)=> {
	// 清除定时器
	if (timeout !== null) clearTimeout(timeout);
	// 立即执行，此类情况一般用不到
	if (immediate) {
		var callNow = !timeout;
		timeout = setTimeout(function() {
			timeout = null;
		}, wait);
		if (callNow) typeof func === 'function' && func();
	} else {
		// 设置定时器，当最后一次操作后，timeout不会再被清除，所以在延时wait毫秒后执行func回调方法
		timeout = setTimeout(function() {
			typeof func === 'function' && func();
		}, wait);
	}
}
